#include <head.h>

//定义条件变量
pthread_cond_t cond1;
pthread_cond_t cond2;

//定义互斥锁
pthread_mutex_t mutex;
//定义线程号
pthread_t tid[3];

//定义线进程函数
void*foun1(void*val);
void*foun2(void*val);
void*foun3(void*val);

int main(int argc, char const *argv[])
{
    // 初始化条件变量和互斥锁
    pthread_cond_init(&cond1, NULL);
    pthread_cond_init(&cond2, NULL);
    pthread_mutex_init(&mutex, NULL);

    // 创建线程
    pthread_create(&tid[0], NULL, foun1, NULL);
    pthread_create(&tid[1], NULL, foun2, NULL);
    pthread_create(&tid[2], NULL, foun3, NULL);

    // 等待线程结束
    for (size_t i = 0; i <3; i++)
    {
        pthread_join(tid[i], NULL);
    }
    
    // 销毁条件变量和互斥锁
    pthread_cond_destroy(&cond1);
    pthread_cond_destroy(&cond2);
    pthread_mutex_destroy(&mutex);

    return 0;
}

//描述线进程函数
void*foun1(void*val)
{
    printf("工序A等待.....");
    // 获取互斥锁
    pthread_mutex_lock(&mutex);

    // 线程1执行代码
    printf("工序A开始...\n");
    sleep(1);

    // 启动线程2
    pthread_cond_signal(&cond1);

    // 释放互斥锁
    pthread_mutex_unlock(&mutex);

    return NULL;
}
void*foun2(void*val)
{
    printf("工序B等待.....");
    // 获取互斥锁
    pthread_mutex_lock(&mutex);

    // 等待线程1条件变量
    pthread_cond_wait(&cond1, &mutex);

    // 线程2执行代码
    printf("工序B开始...\n");
    sleep(1);

    // 启动线程3
    pthread_cond_signal(&cond2);

    // 释放互斥锁
    pthread_mutex_unlock(&mutex);

    return NULL;
}
void*foun3(void*val)
{
    printf("工序1等待.....");
    // 获取互斥锁
    pthread_mutex_lock(&mutex);

    // 等待线程2条件变量
    pthread_cond_wait(&cond2, &mutex);

    // 线程3执行代码
    printf("工序C开始...\n");
    sleep(1);

    // 释放互斥锁
    pthread_mutex_unlock(&mutex);

    return NULL;
}
